/**
 * +----------------------------------------------------------------------
 * | 「e家宜业」 —— 助力物业服务升级，用心服务万千业主
 * +----------------------------------------------------------------------
 * | Copyright (c) 2020-2022 https://www.chowa.cn All rights reserved.
 * +----------------------------------------------------------------------
 * | Licensed 未经许可不能去掉「e家宜业」和「卓瓦科技」相关版权
 * +----------------------------------------------------------------------
 * | Author: contact@chowa.cn
 * +----------------------------------------------------------------------
 */
let queue = [];
const defaultOptions = {
  show: false,
  title: '',
  width: null,
  theme: 'default',
  message: '',
  zIndex: 100,
  overlay: true,
  selector: '#cw-dialog',
  className: '',
  asyncClose: false,
  beforeClose: null,
  transition: 'scale',
  customStyle: '',
  messageAlign: '',
  overlayStyle: '',
  confirmButtonText: '确认',
  cancelButtonText: '取消',
  showConfirmButton: true,
  showCancelButton: false,
  closeOnClickOverlay: false,
  confirmButtonOpenType: ''
};
let currentOptions = Object.assign({}, defaultOptions);

function getContext() {
  const pages = getCurrentPages();
  return pages[pages.length - 1];
}

const Dialog = options => {
  options = Object.assign(Object.assign({}, currentOptions), options);
  return new Promise((resolve, reject) => {
    const context = options.context || getContext();
    const dialog = context.$mp.page.selectComponent(options.selector).$vm;
    delete options.context;
    delete options.selector;

    if (dialog) {
      dialog.setData(Object.assign({
        callback: (action, instance) => {
          action === 'confirm' ? resolve(instance) : reject(instance);
        }
      }, options));
      uni.nextTick(() => {
        dialog.setData({
          show: true
        });
      });
      queue.push(dialog);
    } else {
      console.warn('未找到 cw-dialog 节点，请确认 selector 及 context 是否正确');
    }
  });
};

Dialog.alert = options => Dialog(options);

Dialog.confirm = options => Dialog(Object.assign({
  showCancelButton: true
}, options));

Dialog.close = () => {
  queue.forEach(dialog => {
    dialog.close();
  });
  queue = [];
};

Dialog.stopLoading = () => {
  queue.forEach(dialog => {
    dialog.stopLoading();
  });
};

Dialog.currentOptions = currentOptions;
Dialog.defaultOptions = defaultOptions;

Dialog.setDefaultOptions = options => {
  currentOptions = Object.assign(Object.assign({}, currentOptions), options);
  Dialog.currentOptions = currentOptions;
};

Dialog.resetDefaultOptions = () => {
  currentOptions = Object.assign({}, defaultOptions);
  Dialog.currentOptions = currentOptions;
};

Dialog.resetDefaultOptions();
export default Dialog;